package com.tools.web.work.dictionary;

import com.tools.common.object.Note;

import java.util.Objects;

/**
 * 前端所需的 item 数据结构
 * */
@Note("前端所需的 item 数据结构")
public class Item<V> {

    @Note("item 的值")
    private V value;

    @Note("item 的文本标签")
    private String label;

    /* **************************************************************************************
     *
     *          构造器
     *
     * **************************************************************************************
     * */

    public Item() {}

    public Item(V value, String label) {
        this.setValue(value);
        this.setLabel(label);
    }

    /* **************************************************************************************
     *
     *          Getter / Setter
     *
     * **************************************************************************************
     * */

    public V getValue() {
        return value;
    }

    public void setValue(V value) {
        this.value = value;
    }

    public String getLabel() {
        return label;
    }

    public void setLabel(String label) {
        this.label = label;
    }

    @Override
    public String toString() {
        return "Item{" +
                "value=" + value +
                ", label=" + label +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Item<?> item = (Item<?>) o;
        return Objects.equals(value, item.value) && Objects.equals(label, item.label);
    }

    @Override
    public int hashCode() {
        return Objects.hash(value, label);
    }

    /* **************************************************************************************
     *
     *          链式方法
     *
     * **************************************************************************************
     * */

    public Item<V> value(V value) {
        this.setValue(value);
        return this;
    }

    public Item<V> label(String label) {
        this.setLabel(label);
        return this;
    }
}
